#pragma once
#include <iostream>
#include <unordered_map>

namespace rcrpc{
    #define KEY_METHOD       "method"
    #define KEY_PARAMS       "parameters"
    #define KEY_TOPIC_KEY    "topic_key"
    #define KEY_TOPIC_MSG    "topic_msg"
    #define KEY_OPTYPE       "optype"
    #define KEY_HOST         "host"
    #define KEY_HOST_IP      "ip"
    #define KEY_HOST_PORT    "port"
    #define KEY_RECODE       "recode"
    #define KEY_RESULT       "result"

    enum class MType{
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,  // 用于处理客户端发送的请求消息
        RSP_SERVICE   // 用于处理服务器返回的响应消息
    };

    enum class RCode{
        RCODE_OK = 0,
        RCODE_PARSE_FAILED,
        RCODE_ERROR_MSGTYPE,
        RCODE_ERROR_MSGTYPEG,
        RCODE_DISCONNECTION,
        RCODE_INVALID_PARAMS,
        RCODE_NOT_FOUND_SERVICE,
        RCODE_INVALID_OPTYPE,
        RCODE_NOT_FOUND_TOPIC,
        RCODE_INTERNAL_ERROR
    };
        // 因为打印都是用宏函数，后面可以直接改为 it->second.c_str() 返回类型为char*
        static std::string errReason(RCode code) {
            static std::unordered_map<RCode,std::string> err_map = {
                {RCode::RCODE_OK,"成功处理！"},
                {RCode::RCODE_PARSE_FAILED, "消息解析失败！"},
                {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误"},
                {RCode::RCODE_DISCONNECTION, "连接已断开"},
                {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数"},
                {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务"},
                {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型"},
                {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题"},
                {RCode::RCODE_INTERNAL_ERROR, "内部错误"} 
            };
            auto it  = err_map.find(code);
            if(it == err_map.end()){
                return "未知错误！";
            }
            return it->second;
        };
    

    enum class RType {
        REQ_ASYNC = 0,
        REQ_CALLBACK
    };

    enum class TopicOptype {
        TOPIC_CREATE =0,
        TOPIC_REMOVE,
        TOPIC_SUBSCRIBE,
        TOPIC_CANCEL,
        TOPIC_PUBLISH
    };

    enum class ServiceOptype {
        SERVICE_REGISTER = 0,
        SERVICE_DISCOVERY,
        SERVICE_ONLINE,
        SERVICE_OFFLINE,
        SERVICE_UNKNOW
    };
}